package com.mall.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.mall.constants.StatusConstants;
import com.mall.domain.dto.CategoryDTO;
import com.mall.domain.po.Category;
import com.mall.domain.vo.CategoryVO;
import com.mall.mapper.CategoryMapper;
import com.mall.mapper.ItemMapper;
import com.mall.service.CategoryService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 分类业务实现类
 * @author 勾新杰
 * @version 1.0
 * @date 2024/11/22 22:58
 */
@Service
@RequiredArgsConstructor
public class CategoryServiceImpl implements CategoryService {

    private final CategoryMapper categoryMapper;

    private final ItemMapper itemMapper;

    /**
     * 添加分类
     *
     * @param categoryDTO 分类传输对象
     */
    @Override
    public void addCategory(CategoryDTO categoryDTO) {
        // 1. 构建分类实体对象
        Category category = Category.builder()
                .status(StatusConstants.DISABLE)
                .createTime(LocalDateTime.now())
                .updateTime(LocalDateTime.now())
                .build();
        // 2. 将传输对象中的数据复制到实体对象中
        BeanUtil.copyProperties(categoryDTO, category);
        // 3. 插入数据库
        categoryMapper.insert(category);
    }

    /**
     * 启用或者禁用分类
     *
     * @param id     分类id
     * @param status 状态
     */
    @Override
    public void updateStatus(Long id, Integer status) {
        // 1. 构建分类实体对象
        Category category = Category.builder()
                .id(id)
                .status(status)
                .build();
        // 2. 更新数据库
        categoryMapper.update(category);
    }

    /**
     * 查询分类列表
     *
     * @return 分类视图对象集合
     */
    @Override
    public List<CategoryVO> listCategory() {
        List<Category> categoryList = categoryMapper.list();
        return BeanUtil.copyToList(categoryList, CategoryVO.class);
    }

    /**
     * 修改分类
     *
     * @param categoryDTO 分类传输对象
     */
    @Override
    public void updateCategory(CategoryDTO categoryDTO) {
        // 1. 构建分类实体对象
        Category category = BeanUtil.copyProperties(categoryDTO, Category.class);
        // 2. 更新数据库
        categoryMapper.update(category);
    }

    /**
     * 删除分类
     *
     * @param id 分类id
     */
    @Override
    @Transactional // 添加事务，保证数据一致性
    public void deleteCategory(Long id) {
        // 1. 删除分类
        categoryMapper.deleteById(id);
        // 2. 删除分类下的商品
        itemMapper.deleteByCategoryId(id);
    }
}
